/******************************************************************************
 * The MIT License (MIT)
 *
 * Copyright (c) 2022-2025 Baldur Karlsson
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 ******************************************************************************/

#include "metal_hook.h"
#include "core/core.h"

static MetalHook metalhook;

static void MetalHooked(void *handle, const char *)
{
  RDCDEBUG("Metal library hooked");

  // store the handle for any pass-through implementations that need to look up their onward
  // pointers
  metalhook.handle = handle;

  // as a hook callback this is only called while capturing
  RDCASSERT(!RenderDoc::Inst().IsReplayApp());

  MetalHook::RegisterGlobalNonHookedMetalFunctions();
}

void MetalHook::RegisterHooks()
{
  RDCLOG("Registering Metal hooks");

  // Library hooks : this should be framework hooks?
  LibraryHooks::RegisterLibraryHook(
      "/System/Library/Frameworks/Metal.framework/Versions/Current/Metal", &MetalHooked);

  // Function hooks
  MetalHook::RegisterGlobalHookedMetalFunctions();
}
